﻿/*
Nombre:                         MovimientoDao
Descripcion:                    Implementacion que maneja las funciones principales sobre los movimientos manejados en la capa de persistencia
Dependencias:                 
Fecha de creación:              20081023
Autor:                          VMORALES
Fecha de modifcación:         
Responsable:                  
Num. de modifcación:            0
*/

#region Imports

using Electrocucaracha.AdminPersonal.DAO.Entidades;
using Electrocucaracha.AdminPersonal.DAO.Acciones;
using Common.Logging;
using System;

#endregion

namespace Electrocucaracha.AdminPersonal.DAO
{
    /// <summary>
    /// Implementacion que maneja las funciones principales sobre los movimientos manejados en la capa de persistencia
    /// </summary>
    public class MovimientoDao : BaseDao, IMovimientoDao
    {
        #region Constantes

        #endregion

        #region Miembros

        private static readonly ILog log = LogManager.GetLogger(typeof(MovimientoDao));
        private static MovimientoDao instancia = new MovimientoDao();

        #endregion

        #region Propiedades

        public static MovimientoDao Instancia
        {
            get
            {
                if (instancia == null)
                {
                    instancia = new MovimientoDao();
                }
                return instancia;
            }
        }//Instancia

        #endregion

        #region Constructores

        private MovimientoDao()
            :base(){
        }//MovimientoDao

        #endregion

        #region Funciones

        #endregion

        #region IMovimientoDao

        /// <summary>
        /// Funcion que devuelve todos los movimientos de una cuenta en especifica capturados en la capa de persistencia
        /// </summary>
        /// <param name="cuenta">Cuenta a filtrar</param>
        /// <returns>Conjunto de movimientos</returns>
        public MovimientoDTO[] Obtener(CuentaDTO cuenta)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.OBTENER_POR_CUENTA);
            accion.Parametros[Accion.INPUT] = cuenta;

            admin.Ejecutar(accion);

            return (MovimientoDTO[])accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que devuelve todos los movimientos de una categoria en especifica capturados en la capa de persistencia
        /// </summary>
        /// <param name="categoria">Categoria a filtrar</param>
        /// <returns>Conjunto de movimientos</returns>
        public MovimientoDTO[] Obtener(CategoriaDTO categoria)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.OBTENER_POR_CATEGORIA);
            accion.Parametros[Accion.INPUT] = categoria;

            admin.Ejecutar(accion);

            return (MovimientoDTO[])accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que devuelve todos los movimientos que coinciden con los parametros solicitados
        /// </summary>
        /// <param name="idCuenta">Identificador de la cuenta asociada al movimiento</param>
        /// <param name="descripcion">Descripcion del movimiento</param>
        /// <param name="monto">Monto del movimiento</param>
        /// <returns></returns>
        public MovimientoDTO[] Obtener(int idCuenta, string descripcion, decimal monto)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.OBTENER_POR_DATOS_SIMILARES);
            accion.Parametros[Accion.INPUT] = new MovimientoDTO() { 
                IdCuenta = idCuenta,
                Descripcion = descripcion,
                Monto = monto 
            };

            admin.Ejecutar(accion);

            return (MovimientoDTO[])accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que elimina todos los movimientos de una cuenta en especifica capturados en la capa de persistencia
        /// </summary>
        /// <param name="cuenta">Cuenta a eliminar movimientos</param>
        /// <returns>Verdadero en caso de eliminacion falso en caso contrario</returns>
        public bool Eliminar(CuentaDTO cuenta)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.ELIMINAR_POR_CUENTA);
            accion.Parametros[Accion.INPUT] = cuenta;
            admin.Ejecutar(accion);

            return (bool)accion.Parametros[Accion.OUTPUT];
        }//Eliminar

        /// <summary>
        /// Funcion que elimina todos los movimientos de una categoria en especifica capturados en la capa de persistencia
        /// </summary>
        /// <param name="categoria">Categoria a eliminar movimientos</param>
        /// <returns>Verdadero en caso de eliminacion falso en caso contrario</returns>
        public bool Eliminar(CategoriaDTO categoria)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.ELIMINAR_POR_CATEGORIA);
            accion.Parametros[Accion.INPUT] = categoria;
            admin.Ejecutar(accion);

            return (bool)accion.Parametros[Accion.OUTPUT];
        }//Eliminar

        #endregion

        #region IGenericoDao

        /// <summary>
        /// Funcion que agrega un objeto de tipo movimiento a la capa de persistencia
        /// </summary>
        /// <param name="movimiento">Objeto a ser agregado a la capa de persistencia</param>
        /// <returns>Verdadero en caso de exito en la insercion del objeto falso en caso contrario</returns>
        public bool Agregar(ref MovimientoDTO movimiento)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.AGREGAR);
            accion.Parametros[Accion.INPUT] = movimiento;
            accion.Parametros[Accion.OUTPUT] = false;
            if (!this.Existe(movimiento))
            {
                admin.Ejecutar(accion);
            }

            return (bool)accion.Parametros[Accion.OUTPUT];
        }//Agregar

        /// <summary>
        /// Funcion que agrega un conjunto de objetos de tipo movimiento a la capa de persistencia
        /// </summary>
        /// <param name="movimientos">Conjunto de objetos de tipo movimiento a ser agregados</param>
        /// <returns>El indice del ultimo movimiento el cual fue agregado con exito a la capa de persistencia</returns>
        public int Agregar(ref MovimientoDTO[] movimientos)
        {
            int i = 0;
            for (; i < movimientos.Length; i++)
            {
                if (!Agregar(ref movimientos[i]))
                    break;
            }
            return i;
        }//Agregar

        /// <summary>
        /// Funcion que elimina(en caso de existir) un objeto de tipo movimiento de la capa de persistencia
        /// </summary>
        /// <param name="movimiento">Objeto a ser eliminado</param>
        /// <returns>Verdadero en caso de eliminacion falso en caso contrario</returns>
        public bool Eliminar(MovimientoDTO movimiento)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.ELIMINAR);
            accion.Parametros[Accion.INPUT] = movimiento;
            if (Existe(movimiento))
            {
                admin.Ejecutar(accion);
            }

            return (bool)accion.Parametros[Accion.OUTPUT];
        }//Eliminar

        /// <summary>
        /// Funcion que elimina(en caso de existir) un conjunto de objetos de tipo movimiento de la capa de persistencia
        /// </summary>
        /// <param name="movimientos">Conjunto de objetos a ser eliminados</param>
        /// <returns>El indice del ultimo movimiento el cual fue eliminado con exito a la capa de persistencia</returns>
        public int Eliminar(MovimientoDTO[] movimientos)
        {
            int i = 0;
            for (; i < movimientos.Length; i++)
            {
                if (!Eliminar(movimientos[i]))
                    break;
            }
            return i;
        }//Eliminar

        /// <summary>
        /// Funcion que obtiene un movimiento, de la capa de persistencia, a partir de su identificador
        /// </summary>
        /// <param name="id">Identificador del movimiento a obtener</param>
        /// <returns>Un movimiento en caso de encontrarlo nulo en caso contrario</returns>
        public MovimientoDTO Obtener(int id)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.OBTENER);
            accion.Parametros[Accion.INPUT] = id;
            admin.Ejecutar(accion);

            return (MovimientoDTO)accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que devuelve todos los movimientos registrados en la capa de persistencia
        /// </summary>
        /// <returns>Conjunto de movimientos</returns>
        public MovimientoDTO[] Obtener()
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.OBTENER_TODOS);
            admin.Ejecutar(accion);

            return (MovimientoDTO[])accion.Parametros[Accion.OUTPUT];
        }//Obtener

        /// <summary>
        /// Funcion que actualiza sobre la capa de persistencia un movimiento especifico
        /// </summary>
        /// <param name="movimiento">Movimiento a sobrescribir datos de la entidad ubicada en la capa de persistencia</param>
        /// <returns>Verdadero en caso de su correcta actualizacion</returns>
        public bool Actualizar(MovimientoDTO movimiento)
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.ACTUALIZAR);
            accion.Parametros[Accion.INPUT] = movimiento;
            if (Existe(movimiento))
            {
                admin.Ejecutar(accion);
                return (bool)accion.Parametros[Accion.OUTPUT];
            }
            return false;
        }//Actualizar

        /// <summary>
        /// Funcion que actualiza en la capa de persistencia un conjunto de movimientos
        /// </summary>
        /// <param name="movimientos">Conjunto de movimientos a actualizar en la capa de persistencia</param>
        /// <returns>El indice del ultimo  movimiento el cual fue actualizado con exito a la capa de persistencia</returns>
        public int Actualizar(MovimientoDTO[] movimientos)
        {
            int i = 0;
            for (; i < movimientos.Length; i++)
            {
                if (!Actualizar(movimientos[i]))
                    break;
            }
            return i;
        }//Actualizar

        /// <summary>
        /// Funcion que determina si el objeto actualmente se encuentra registrado en la capa de persistencia
        /// </summary>
        /// <param name="movimiento">Objeto a validar su existencia</param>
        /// <returns>Verdadero en caso de existir falso en caso contrario</returns>
        public bool Existe(MovimientoDTO movimiento)
        {
            bool existe = this.Obtener(movimiento.Id) != null;
            if (!existe)
            {
                existe = this.Obtener(movimiento.IdCuenta,movimiento.Descripcion, movimiento.Monto) == null;
            }
            return existe;
        }//Existe

        /// <summary>
        /// Funcion que devuelve la cantidad de movimientos registrados en la capa de persistencia
        /// </summary>
        /// <returns>Cantidad de movimientos registrados</returns>
        public int ObtenerCantidad()
        {
            Accion accion = admin.ObtenerAccion(CatalogoAcciones.Movimiento.OBTENER_CANTIDAD);
            admin.Ejecutar(accion);

            return (int)accion.Parametros[Accion.OUTPUT];
        }//ObtenerCantidad

        /// <summary>
        /// Funcion que resetea el identificador del catalogo de movimientos a cero
        /// </summary>
        public void ResetearId()
        {
            admin.Ejecutar(admin.ObtenerAccion(CatalogoAcciones.Movimiento.RESETEAR_ID));
        }//ResetearId

        /// <summary>
        /// Funcion que valida los campos correctos del objeto
        /// </summary>
        /// <param name="banco">Objeto a ser validado</param>
        /// <param name="validacion">Opciones de validacion de los campos</param>
        public void Validar(MovimientoDTO movimiento, Validaciones validacion)
        {
        }//Validar

        /// <summary>
        /// Funcion que valida cada uno de los elementos de un conjunto de bancos
        /// </summary>
        /// <param name="bancos">Conjunto de bancos a ser validados</param>
        /// <param name="validacion">Opciones de validacion de los campos</param>
        public void Validar(MovimientoDTO[] movimiento, Validaciones validacion)
        {
        }//Validar

        #endregion

    }//MovimientoDao
}//Electrocucaracha.AdminPersonal.DAO